今天就簡單寫一個用 Python FastAPI 作 backend 的範例,
其實我很不想用 backend 這個 term,
不過好像這樣最容易溝通…
這幾天預計
這讓我想起來五、六年前還在純軟公司的時候,
RD team 不會自己 own Dockerfile,
十來個 docker image 全由 DevOps 來 own
然後 Dockerfile 又不是每個 component 底下配置一份,
而是一支 script 一口氣包十來個 docker image,
還包了一堆 legacy depedency
如果提說要 refactor,
大家也都知道提這種東西既沒 visibility,
又要跟 qa team 解釋為什麼要重跑 regression,
總之年輕的 me 也有過這種天真的時刻…再說都是淚
可能是學生時期做過網管的關係,
在 DevOps 這個 term 紅起來之前,
就覺得 backend RD team 自己 own staging environment 不是天經地義的事嗎?
交付邊際切在一個完整的 docker image 聽起來也很合理啊,
理想總是比較骨感…不知道是我的問題還是我沒能去找到改變團隊文化的 key
又扯遠了
先登入 ubuntu-dev-machine,
既然在開發機上,
virtualenv 少不了吧
sudo apt-get install -y python3.10-venv
python3 -m venv ./venv
參考 FastAPI 官方教學,我的檔案會這樣切
.
├── Dockerfile
├── app
├── requirements.txt
└── venv
當然 .gitignore 會加入 venv/
還有 *.pyc
、__pycache__
接著
source venv/bin/activate
pip install "fastapi[all]"
裝完記得導出 python package depedencies
pip freeze > requirements.txt
照著官方把 hello world 貼上 app/main.py
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
for python module,加入
touch app/__init__.py
複製官網給的 Dockerfile,port 號請隨意,然後我這邊就跟著開發機用 Python3.10
FROM python:3.10
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]
到這裡喘一下,
backend 的 hello world + Dockerfile 的 hello world 都準備好了,
來手動部署吧,
docker tag 與 version 請隨意
docker build . -t hello-fastapi:latest
結果如圖
檢查一下
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-fastapi latest 0a37d1779033 56 minutes ago 1.05GB
把 container 跑起來
docker run -d -p 8080:8080 hello-fastapi:latest
戳一下
curl -k localhost:8080
怎麼覺得越寫越像我前兩年棄更的文章CloudNative 開發維運一條龍…
當初竟然撐了 18 天啊…
今年不知道能撐幾天,
能撐一天是一天…
不過可以肯定的是,
沒必要我不想再碰 Kubernetes 那種學不動的東西了…
而且現在來寫,
多了很多經驗,
可以負責任的說,
Ansible AWX 真滴適合懶人用,
或是 RD 自己串個自動化也很方便
相對的,
現在除了廢話變多,
技術也變舊了…也比較少人想看
所以說,
Linux Kernel 現在對我來說比較香 wwwww 永遠不退流行
就醬,今天打完收工